#include <opencv2/opencv.hpp>
#include <iostream>

cv::Scalar brush_color = cv::Scalar(0, 0, 0);  // 初始画笔颜色为黑色
int brush_radius = 5;  // 初始画笔半径

// 回调函数更新颜色和画笔大小
void update_r(int value, void*) { brush_color[2] = value; }  // 更新红色通道
void update_g(int value, void*) { brush_color[1] = value; }  // 更新绿色通道
void update_b(int value, void*) { brush_color[0] = value; }  // 更新蓝色通道
void update_brush_size(int value, void*) { brush_radius = value; }  // 更新画笔大小

// 鼠标回调函数
void draw_circle(int event, int x, int y, int flags, void* param) {
    cv::Mat& img = *(cv::Mat*)param;
    static bool is_drawing = false;

    if (event == cv::EVENT_LBUTTONDOWN) {  // 鼠标左键按下
        is_drawing = true;
        cv::circle(img, cv::Point(x, y), brush_radius, brush_color, -1);
    } else if (event == cv::EVENT_LBUTTONUP) {  // 鼠标左键释放
        is_drawing = false;
    } else if (event == cv::EVENT_MOUSEMOVE && is_drawing) {  // 鼠标移动并按下左键
        cv::circle(img, cv::Point(x, y), brush_radius, brush_color, -1);
    }
}

int main() {
    // 创建一个黑色图像
    cv::Mat img = cv::Mat::zeros(600, 800, CV_8UC3);

    // 创建窗口
    std::string window_name = "Paint Program";
    cv::namedWindow(window_name);

    // 创建轨迹栏并设置回调
    cv::createTrackbar("R", window_name, NULL, 255, update_r);
    cv::createTrackbar("G", window_name, NULL, 255, update_g);
    cv::createTrackbar("B", window_name, NULL, 255, update_b);
    cv::createTrackbar("Brush Size", window_name, NULL, 50, update_brush_size);

    // 设置鼠标回调
    cv::setMouseCallback(window_name, draw_circle, &img);

    while (true) {
        // 显示当前图像
        cv::imshow(window_name, img);

        // 检测按键，按 ESC 键退出
        char k = (char)cv::waitKey(1);
        if (k == 27) {  // ESC 键退出
            break;
        }
    }

    // 释放资源并关闭窗口
    cv::destroyAllWindows();
    return 0;
}
